package com.tedu.review.day02;

/**
 * 普通类
 * 抽象类=抽象方法 关键字 abstract
 * 只有行为的概念 没有具体实现行为
 *
 * 面向对象的多态有绝对关系
 * 产生子类同时具备实现的属性和方法
 *
 * 什么情况下使用
 * 复杂项目时，需要在不同类中实现，不同宫嗯，首先抽象类【android】
 *
 * 定义抽象类
 * 修饰符 abstract class 类名{} 抽象类名没有任何意义
 * 创建抽象类同时存在抽象方法
 * 修饰符 abstract class 类名{}  抽象类的方法，提供给予类使用
 *
 * 抽象类实例化
 * 必须使用多态，向上造型，自身无法实例化
 *
 * 定义 使用 注意
 *
 * 抽象类使用注意：抽象类和抽象方法必须使用abstract关键字修饰
 *              可以定义静态属性，静态方法需要加空{}，不可以定义抽象属性
 *              可以存在构造器，不可以定义静态抽象方法，静态抽象属性
 *              可以存在内部类：静态内部类，抽象类继承抽象类
 *              Java只允许单继承，实现只需要继承子抽象类
 *              final不能修饰抽象方法
 */
//实现类：子类 继承 抽象类 完成：抽象类方法
    class People extends Animals{
    public void say(){
        System.out.println("人--说话~~");
    }
}
//实现类：假设 Animals 有个抽象方法 请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
        public void say(){
            System.out.println("猴子");
        }
}
abstract class Animals{
        //类定义   修饰符  【abstract|static】class 类名（）；

    public  abstract void say();//抽象方法：没有任何实现
    //2.定义修饰final的抽象方法  X
    //public final abstract void sleep();
    //3.定义抽象属性|定义静态属性
  //  abstract int i;
    static int i;//未赋值
    //4.定义抽象静态属性    √
    //abstract static int j;
    //5.定义静态方法  语法：修饰符[static|abstract]返回值  方法名
    //public static abstract void eat();
    //6.定义静态方法   √  需要加代码块{}   一定空   实现类不需要一定实现
    public static void eat(){
    };
    //7.可以存在静态内部类
    public static class Sos{

    }
  //  8.抽象类中构造器存在
    public Animals(){

    }
    //9.抽象类可以继承抽象类     可以
    abstract class Thing extends Animals{
        //成员变量
        protected abstract int result();
    }

    //10.实现类【子类】继承两个抽象类    x    但是，实现最终继承【子】抽象类

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象--实例化【创建对象 不可直接创建】--多态：向上造型
        Animals a=new People();
        a.say();   //输出
        Animals a1=new Monkey();
        a1.say();//输出：重写后的值【方法互通】
    }
}
